import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import griddata

# 设置中文字体和解决负号显示问题
plt.rcParams['font.sans-serif'] = ['Songti SC']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = 14
plt.figure(figsize=(12, 6))
# 读取Excel文件中的温度数据
df = pd.read_excel("./data/InnerMongolia_Daily_high_temp.xls",
                   header=0)

# 提取经纬度和温度数据
x = df['longitude']
y = df['latitude']
z = df['high_temp']

# 创建网格点
xi = np.linspace(x.min(), x.max(), 100)
yi = np.linspace(y.min(), y.max(), 100)
XI, YI = np.meshgrid(xi, yi)

# 插值
ZI = griddata(points=df[['longitude', 'latitude']], values=z,
              xi=(XI, YI), method='cubic')
# 绘制等高线图
contour = plt.contour(XI, YI, ZI, levels=12, cmap='coolwarm')
plt.clabel(contour, inline=True, fontsize=16)  # 添加等温线标签
plt.colorbar(contour, label='温度 (°C)')

# 在图上加上原始数据点的位置
plt.scatter(x, y, c='black', s=20, label='观测点', zorder=5)
# 显示每个点的城市名（假设列名为 'city'）
for i in range(len(x)):
    plt.text(x.iloc[i], y.iloc[i], df['city'].iloc[i],
             fontsize=10, color='red',
             ha='left', va='bottom')
# 设置标题和坐标轴标签
plt.title('内蒙古地区日最高气温等高线图（含观测点）')
plt.xlabel('经度')
plt.ylabel('纬度')
plt.legend()
plt.grid(True, linestyle='--', alpha=0.5)
plt.xlim(105, 123)
plt.ylim(38, 50)
# 显示图表
plt.tight_layout()
plt.savefig('./Figures/contour09-11.png', dpi=300)
plt.show()
